/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package webBeans;

import ejbean.RolBeanLocal;
import ejbean.UsuarioBeanLocal;
import entities.Rol;
import entities.Usuario;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Locale;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.ejb.EJB;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;
import javax.faces.component.UIComponent;
import javax.faces.component.UIInput;
import javax.faces.context.FacesContext;
import javax.faces.model.SelectItem;
import javax.faces.validator.ValidatorException;

/**
 *
 * @author Alex
 */
@ManagedBean
@RequestScoped
public class SignupManagedBean {

    @EJB
    private RolBeanLocal rolBean;
    private FacesContext context;
    @EJB
    private UsuarioBeanLocal usuarioBean;
    private Usuario usuario;
    private String repassword;
    private SelectItem[] listaRoles;

    public String getRol() {
        return rol;
    }

    public void setRol(String rol) {
        this.rol = rol;
    }
    private String rol;

//    public SelectItem[] getListaRoles() {
//        usuario = (Usuario) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("usuario");
//        if (usuario.getRolId().getRolId() == 5) {
//            List<Rol> roles = rolBean.findAll();
//            listaRoles = new SelectItem[roles.size()];
//            int i = 0;
//            for (Rol r : roles) {
//                listaRoles[i] = new SelectItem(r.getDescripcion());
//                i++;
//            }
//            return listaRoles;
//        }
//        List<Rol> roles = rolBean.findByRolAdmin();
//            listaRoles = new SelectItem[roles.size()];
//            int i = 0;
//            for (Rol r : roles) {
//                listaRoles[i] = new SelectItem(r.getDescripcion());
//                i++;
//            }
//        return listaRoles;
//    }
    
    public SelectItem[] getListaRoles() {
        usuario = (Usuario) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("usuario");
        List<Rol> roles = new ArrayList<Rol>();
        if (usuario.getRolId().getRolId() == 5) {
            roles = rolBean.findAll();
        } else {
            roles = rolBean.findByRolAdmin();
        }
        
            listaRoles = new SelectItem[roles.size()];
            int i = 0;
            for (Rol r : roles) {
                listaRoles[i] = new SelectItem(r.getDescripcion());
                i++;
            }
        return listaRoles;
    }

    public void setListaRoles(SelectItem[] listaRoles) {
        this.listaRoles = listaRoles;
    }

    public SignupManagedBean() {
        usuario = new Usuario();
        context = FacesContext.getCurrentInstance();
        Locale idioma = (Locale) context.getExternalContext().getSessionMap().get("idioma");
        FacesContext.getCurrentInstance().getViewRoot().setLocale(idioma);
    }

    public Usuario getUsuario() {
        return usuario;
    }

    public String getRepassword() {
        return repassword;
    }

    public void setRepassword(String repassword) {
        this.repassword = repassword;
    }

    public String signup() {
        String res = validate();

        if (!res.equals("ERROR")) {
            usuario.setRolId(new Rol(2));
            usuario.setFechaRegistro(new Date());
            Usuario flag = usuarioBean.insert(usuario);

            if (flag == null) {
                context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "Error", "The user could not be created."));

                res = "ERROR";
            } else {
                context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "OK", "The user has been created."));
            }
        }

        return res;
    }

    public String editProfile() {

        usuario = (Usuario) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("usuario");

        if (!usuario.getRolId().getDescripcion().equals("")) {
            rol = usuario.getRolId().getDescripcion();
        }

        usuario.setRolId(traduceRol());

        String res = validate();

        if (!res.equals("ERROR")) {
            Usuario flag = usuarioBean.update(usuario);

            if (flag == null) {
                context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "Error", "The user could not be created."));

                res = "ERROR";
            } else {
                context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "OK", "The user has been created."));
            }
        }

        return res;
    }

    public String editOtherProfile() {

        usuario = (Usuario) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("user");

        if (!usuario.getRolId().getDescripcion().equals("")) {
            rol = usuario.getRolId().getDescripcion();
        }

        usuario.setRolId(traduceRol());
        //

//        String res = validate();

//        if (!res.equals("ERROR")) {
            Usuario flag = usuarioBean.update(usuario);
//
//            if (flag == null) {
//                context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "Error", "The user could not be created."));
//
//                res = "ERROR";
//            } else {
//                context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "OK", "The user has been created."));
//            }
//        }

        return "OK";
    }

    private String validate() {
        String res = "OK";

        if (usuario.getNombre().equals("")) {
            context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "Error", "The Name field is required."));

            res = "ERROR";
        } else if (usuario.getApellidos().equals("")) {
            context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "Error", "The Surname field is required."));

            res = "ERROR";
        }
        if (usuario.getDireccion().equals("")) {
            context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "Error", "The Direccion field is required."));

            res = "ERROR";
        }
        if (usuario.getTelefono().equals("")) {
            context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "Error", "The Telefono field is required."));

            res = "ERROR";
        }
        if (usuario.getLocalidad().equals("")) {
            context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "Error", "The Localidad field is required."));

            res = "ERROR";
        }
        if (usuario.getProvincia().equals("")) {
            context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "Error", "The provincia field is required."));

            res = "ERROR";
        } else if (usuario.getEmail().equals("")) {
            context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "Error", "The Email field is required."));

            res = "ERROR";
        } else if (usuario.getPassword().equals("")) {
            context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "Error", "The Password field is required."));

            res = "ERROR";
        } else if (repassword.equals("")) {
            context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "Error", "The RePassword field is required."));

            res = "ERROR";
        } else if (!usuario.getPassword().equals(repassword)) {
            context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "Error", "The Password and RePassword field are not equals."));

            res = "ERROR";
        }

        return res;
    }

    public Rol traduceRol() {
        Rol res = new Rol();
        res = (Rol) rolBean.findByDescripcion(rol);
        return res;
    }

    public List<Usuario> getUsuarios() {
        usuario = (Usuario) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("usuario");
        if (usuario.getRolId().getRolId() == 5) {
            System.out.println("si es superusuaio" + usuario.getRolId().getRolId());
            return usuarioBean.findAll();
        }
        System.out.println("no es superusuario" + usuario.getRolId().getRolId());
        return usuarioBean.findAllSinSuper();
    }

    public String deleteProfile(Usuario u) {
        String res = "DELETE";
        usuarioBean.remove(u);
        return res;
    }

    public String deleteUsuario() {
        String res = "DELETE";
        usuario = (Usuario) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("user");
        if (usuario.getActivo().equals("Y") || usuario.getActivo().equals(null)) {
            usuario.setActivo("N");
        } else {
            usuario.setActivo("Y");
        }
        usuarioBean.update(usuario);
        FacesContext.getCurrentInstance().getExternalContext().getSessionMap().put("user", usuario);
        return res;
    }

    public void validarLogin(FacesContext facesContext, UIComponent uiComponent, Object object)
            throws ValidatorException {
        Usuario u = null;
        u = usuarioBean.findByEmail(object.toString());
        if (u != null) {
            throw new ValidatorException(new FacesMessage(FacesMessage.SEVERITY_INFO, "Email utilizado ya existe", "El email ya existe"));

        } else if (!validateEmail(facesContext, uiComponent, object)) {
            ((UIInput) uiComponent).setSubmittedValue("");
            FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_INFO, "Email utilizado no cumple el patron", "El email no cumple el patron");
            throw new ValidatorException(message);
        }
    }

    public boolean validateEmail(FacesContext facesContext, UIComponent uiComponent, Object object)
            throws ValidatorException {
        boolean res = true;
        String email = (String) object;
        Pattern p = Pattern.compile("[a-zA-Z]+@[a-zA-Z]+\\.[a-zA-Z]+");
        Matcher m = p.matcher(email);
        if (!m.matches()) {
            res = false;
        }
        return res;
    }

    public void validarCp(FacesContext facesContext, UIComponent uiComponent, Object object)
            throws ValidatorException {
        try {
            Integer o = (Integer) object;
            String cp = o.toString();
            if (cp.length() != 5) {
                throw new ValidatorException(new FacesMessage("Al menos 5 caracteres "));
            }
        } catch (NumberFormatException cp) {
            throw new ValidatorException(new FacesMessage("Hay que introducir un numero!!! "));
        }
    }

    public void validarTelefono(FacesContext facesContext, UIComponent uiComponent, Object object)
            throws ValidatorException {
        try {
            Integer o = (Integer) object;
            String tl = o.toString();
            if (tl.length() != 9) {
                throw new ValidatorException(new FacesMessage("Necesitas 9 caracteres "));
            }
        } catch (NumberFormatException tl) {
            throw new ValidatorException(new FacesMessage("Hay que introducir un numero!!! "));
        }
    }
}
